Repository navigation
feat(qc,#18962): FinBERT re-entraine - portage 06/19/02 + mesure hors echantillon - #19670
Conversation
… echantillon Portage fidele du re-entrainement FinBERT du livre (exemple 06/19/02) et mesure hors echantillon contre le modele de base pre-entraine. Artefacts : - main_finetuned.py : portage du FinbertFineTunedModelAlgorithm (ecarts n1-n8 documentes en tete de fichier) - finetune/run_finetune_finbert.py : harnais hors ligne (corpus FNSPID, etiquetage par reaction de cours, re-entrainement GPU, evaluation hors echantillon base contre re-entraine) - finetune/measures/ : une mesure par graine + agregat - README.md : section resultat mesuree et verdict Mesure (graines 1/2/3/42, RTX 3080 Ti Laptop, torch 2.8.0+cu126, 1 680 echantillons d'entrainement sur 53 mois, 268 hors echantillon sur 6 mois) : - exactitude du modele de base : 0,4515 - exactitude re-entrainee moyenne : 0,3461 - ecart moyen -0,1054, ecart-type inter-graines 0,0361, soit -2,92 sigma - aucune graine sur quatre ne bat le modele de base Verdict : NO BEATS. La distribution des classes predites montre que le modele re-entraine perd la classe neutre (0 a 14 predits sur 268, contre 75 reels), avec un signe de desequilibre qui depend de la graine - ce n'est donc pas un effondrement sur une classe fixe. Voir #18962 : la moitie Chronos du meme exemple est portee par la PR #19622. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s a jour Critere 5 de #18962 : la table du chapitre 06 portait le re-entrainement FinBERT en `GAP`. - 19/02 : `GAP` -> `COVERED`, avec le harnais et le verdict mesure (NO BEATS, ecart moyen -0,1054, -2,92 sigma, aucune graine gagnante). - 19/01 : la remarque « le portage ne produit pas de transaction » est perimee -- le livrable v7 produit ses deux rebalancements (mesure du 2026-10-05). #18903 reste ouverte ; c'est sa fermeture qui revient au coordinateur, pas le constat. - Table des chiffres du livre (19/02) : `aucune reproduction (GAP)` -> les mesures hors echantillon. La ligne 306 (« Exemples sans reproduction », 06/18/02 et 06/19/02) n'est pas touchee : la PR #19622, ouverte sur la moitie Chronos, la reecrit deja. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
|
aucun genre mots-clé fermant dans le body ni les commits ; prev: accepté(s) : #19559 Run vert du garde : ce commentaire bloquant est obsolète. Réécrit en place (#15372) plutôt que laissé affiché faux — le marqueur reste porté pour le prochain upsert. Historique : runs |
… lignes livrenees (#18903, #18957) Addendum file profonde du coordinateur (msg-20261007T065859-z4zhz5) : trois restes fermes dans un seul commit. 1. #18903, critere 4 : le README du modele de base refuse d'ecrire un verdict. Il l'ecrit desormais -- INCONCLUSIVE -- avec son motif : sur 40 seances et 2 ordres, l'echantillon est trop court pour conclure ; ce backtest verifie que le portage complete et trade, il ne mesure pas la strategie. 2. #18957 : la ligne 04/05, 04/18, 05/02, 05/15 de la section « Exemples sans reproduction » est retiree -- #19163 les a portes, ils sont COVERED plus haut dans la table. 3. #18962 : la ligne 06/18/02, 06/19/02 garde seulement Chronos (06/18/02, depend de #19622) ; FinBERT 19/02 passe COVERED par cette PR. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
c1c5191 to
c9a878a
Compare
|
[INFO] Diagnostic du rouge prev_guard (jambe Always-on guards, run 37583230416) — defect de ce body, pas de la base Verbatim du verdict : prev-abandoned -> [19626]. La référence Correctif d'une ligne : remplacer |
Path-collision (organ #13359/#13615)Cette PR #19670 (
|
|
[ADJOINT PREFLIGHT] Dossier tiers emis par Actes de lecture.
|
Grain: DEEP/qc — lane myia-po-2023:CoursIA — prev: MED/docs #19559
See #18962 — la moitié FinBERT. La moitié Chronos du même exemple est portée par la PR #19622, ouverte. See #18903 (verdict
INCONCLUSIVEdu modèle de base, critère 4). See #18957 (ligne retirée de « Exemples sans reproduction »).Ce que la PR livre
Le ré-entraînement FinBERT du livre (exemple 06/19/02) n'existait pas dans le dépôt : la table du chapitre 06 le portait en
GAP. Cette PR le porte, et le mesure hors échantillon — ce que le livre ne fait pas.main_finetuned.pyFinbertFineTunedModelAlgorithmdu livre ; écarts n1–n8 documentés en tête de fichier. Non exécutable en CI ni sur un nœud QC ordinaire : le ré-entraînement tourne dans l'algorithme et demande un GPU.finetune/run_finetune_finbert.pyfinetune/measures/README.mdBOOK_MAPPING.md04/05, 04/18, 05/02, 05/15retirée de « Exemples sans reproduction » (#18957, portées par #19163) et ligne06/18/02, 06/19/02réduite à Chronos (addendum du coordinateur).README.md(§Métriques)INCONCLUSIVE, avec son motif (critère 4 de #18903).Critères de l'issue #18962, un par un
RECOVERABLE-MACHINE)main_finetuned.py(portage) +finetune/(harnais), exécuté sur le RTX 3080 Ti de po-2023Protocole
Stock_news/All_external.csv(date + ticker + titre, même forme que le Tiingo News du livre). Cache local hors dépôt (CC BY-NC 4.0) : seules les mesures sont committées.from_pretrained(..., num_labels=3)frais chaque mois, Adamlr3e-5, 2 époques.Résultat — 4 graines
Écart moyen −0,1054, écart-type inter-graines 0,0361, soit −2,92 σ ; aucune graine sur quatre ne bat le modèle de base (
graines_gagnantes = 0).Significativité. McNemar exact sur les paires discordantes, l'analogue classé de Diebold-Mariano : les quatre graines ont plus de paires où la base a raison et le ré-entraîné tort que l'inverse (79/37, 69/47, 69/48, 79/51). Ce n'est pas un σ seul : les deux jambes concordent.
Effet sur la stratégie (mêmes règles des deux côtés, même graine de tirage) : rendement cumulé −0,037 (base) contre −0,046 (ré-entraîné). Les deux bras perdent ; le ré-entraîné perd davantage. Aucune métrique de performance n'est revendiquée ici : ce rendement vient du harnais hors ligne, pas d'un backtest QC.
Verdict : NO BEATS
Au sens strict : ce n'est pas « amélioration non démontrée », c'est dégradation démontrée. Le modèle ré-entraîné est moins exact que le modèle de base sur les quatre graines, d'un écart significatif.
Ce que la distribution des classes prédites ajoute, et que l'exactitude seule ne montrerait pas. Le modèle de base prédit [70, 105, 93] : il sur-prédit le neutre, biais connu de FinBERT sur du texte court. Le ré-entraîné prédit 0 à 14 neutres sur 268, quelle que soit la graine — la classe neutre disparaît. Le signe du déséquilibre dépend en revanche de la graine (242 positifs pour la graine 2, 203 négatifs pour la graine 42) : ce n'est donc pas un effondrement sur une classe fixe, mais la perte du neutre et une instabilité de signe d'une graine à l'autre. Deux époques à 3e-5 sur 1 680 étiquettes bruitées suffisent à détruire la frontière du neutre d'un modèle pré-entraîné.
Ce que ce verdict ne dit pas. Il ne condamne pas la recette du livre ; il condamne sa mesure hors échantillon dans ces conditions. Le livre ré-entraîne et prédit sur les mêmes 100 échantillons du mois : sa mesure ne peut pas voir cette perte. C'est exactement l'écart que l'issue demandait de mesurer.
Portée. Un univers de 24 grandes capitalisations, une fenêtre (2015-2019), un modèle de base, quatre graines. Falsifiable via
finetune/measures/, reproductible parfinetune/run_finetune_finbert.py.Preuves d'exécution
device = NVIDIA GeForce RTX 3080 Ti Laptop GPU,torch = 2.8.0+cu126. Le nom de la carte est journalisé par le harnais, pas seulement l'index — sur une machine à deux GPU,cuda:0ne dit pas laquelle a travaillé.pred_base,pred_finetuned,vraisont committés par graine — c'est l'instrument qui sépare « il se trompe » de « il a effondré sa sortie ».Pas de backtest pour le bras ré-entraîné — pourquoi
main_finetuned.pyré-entraîne dans l'algorithme et demande un GPU : il n'est pas déployable sur QC Cloud, pour la même raison que l'exemple du livre lui-même. C'est l'exception GPU-only de la règle F, déclarée, pas un contournement.Le bras de base est, lui, backtesté : livrable v7, 2022-01-01 → 2022-03-01, capital 1 M, 40 séances, statut
Completed., 2 ordres (= les deux rebalancements mensuels), Sharpe −1,137, rendement net −26,230 %, drawdown max 37,800 % (projet QC 29936073 ; table complète au §Historique du README). Ces chiffres étaient déjà surmainavant cette PR.Deux écarts au livre — mesurés, pas supposés
Resolution.SECOND). À résolution quotidienne, la règle s'effondre : 410 des 680 paires (60 %) tombent dans la même séance, donc 429 étiquettes (63 %) sont nulles exactement — une classe neutre majoritaire à 75 % que le livre ne connaît pas. Le harnais mesure la réaction à la parution. La distribution des classes passe de 12/75/13 à 32/29/38, contre les 37,5/25/37,5 que la règle du livre vise.Les deux sont écrites en tête du harnais et détaillées dans le README.
Conflit attendu, déclaré
La ligne 306 de
BOOK_MAPPING.md(table « Exemples sans reproduction ») est également réécrite par la PR #19622. Cette PR la touche sur instruction du coordinateur (addendum du 07/10, msg-20261007T065859-z4zhz5) : elle la réduit à06/18/02— la part Chronos, qui dépend de #19622 — puisque06/19/02passe COVERED ici. Quand l'une des deux PRs mergera, l'autre devra une résolution d'une ligne : garder la version réduite à Chronos, ou retirer la ligne entière si #19622 est déjà mergée.Les lignes 19/01 et 19/02 que j'ai modifiées sont voisines de la ligne 18/02 que #19622 modifie : un conflit de voisinage reste possible, il se résout en gardant les deux modifications (aucune ne se recouvre).
Observation, non corrigée ici : la réécriture de la ligne 306 par #19622 porte «
06/19/02… bloqué par #18903 ». #18903 est encore ouverte, mais son blocage est levé par la mesure (le livrable v7 produit ses deux ordres, cf. ci-dessus) — la formulation sera à revoir au merge.Ce que la PR ne fait pas
main.pyni le notebook de la série : le portage de base n'est pas modifié.See, jamaisCloses).🤖 Generated with Claude Code